+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
+Mon Sep 25 15:05:17 2000 Owen Taylor <otaylor@redhat.com>
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c (gdk_window_iconify):
+ Add gdk_window_iconify.
+
+ * gdk/gdkwindow.h gdk/x11/gdkwindow-x11.c
+ (gdk_window_set_geometry_hints): Add win_gravity
+ to geometry structure.
+
+ * gdk/x11/gdkevents-x11.c (gdk_wm_protocols_filter):
+ Implement _NET_WM_PING.
+
+ * gdk/x11/gdkmain-x11.c (_gdk_windowing_init_check):
+ Set _NET_WM_PID on the client leader.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_icon_name):
+ Handle UTF-8 better.
+
+ * gdk/x11/gdkwindow-x11.c (gdk_window_set_title): Handle
+ UTF-8 better, set _NET_WM_NAME as well. Only set
+ icon name if it hasn't previously been explicitely
+ set.
+
2000-10-03 Havoc Pennington <hp@redhat.com>
* gtk/testtextbuffer.c: clean up trailing whitespace,
*/
typedef enum
{
- GDK_HINT_POS = 1 << 0,
- GDK_HINT_MIN_SIZE = 1 << 1,
- GDK_HINT_MAX_SIZE = 1 << 2,
- GDK_HINT_BASE_SIZE = 1 << 3,
- GDK_HINT_ASPECT = 1 << 4,
- GDK_HINT_RESIZE_INC = 1 << 5
+ GDK_HINT_POS = 1 << 0,
+ GDK_HINT_MIN_SIZE = 1 << 1,
+ GDK_HINT_MAX_SIZE = 1 << 2,
+ GDK_HINT_BASE_SIZE = 1 << 3,
+ GDK_HINT_ASPECT = 1 << 4,
+ GDK_HINT_RESIZE_INC = 1 << 5,
+ GDK_HINT_WIN_GRAVITY = 1 << 6
} GdkWindowHints;
/* The next two enumeration values current match the
GDK_FUNC_CLOSE = 1 << 5
} GdkWMFunction;
+/* Currently, these are the same values numerically as in the
+ * X protocol. If you change that, gdkwindow-x11.c/gdk_window_set_geometry_hints()
+ * will need fixing.
+ */
+typedef enum
+{
+ GDK_GRAVITY_NORTH_WEST = 1,
+ GDK_GRAVITY_NORTH,
+ GDK_GRAVITY_NORTH_EAST,
+ GDK_GRAVITY_WEST,
+ GDK_GRAVITY_CENTER,
+ GDK_GRAVITY_EAST,
+ GDK_GRAVITY_SOUTH_WEST,
+ GDK_GRAVITY_SOUTH,
+ GDK_GRAVITY_SOUTH_EAST,
+ GDK_GRAVITY_STATIC,
+} GdkGravity;
+
struct _GdkWindowAttr
{
gchar *title;
gint height_inc;
gdouble min_aspect;
gdouble max_aspect;
- /* GdkGravity gravity; */
+ GdkGravity win_gravity;
};
typedef struct _GdkWindowObject GdkWindowObject;
void gdk_window_set_functions (GdkWindow *window,
GdkWMFunction functions);
GList * gdk_window_get_toplevels (void);
+void gdk_window_iconify (GdkWindow *window);
void gdk_window_register_dnd (GdkWindow *window);
else if ((Atom) xevent->xclient.data.l[0] == gdk_wm_take_focus)
{
}
+ else if ((Atom) xevent->xclient.data.l[0] == gdk_atom_intern ("_NET_WM_PING", FALSE))
+ {
+ XEvent xev = *xevent;
+
+ xev.xclient.window = gdk_root_window;
+ XSendEvent (gdk_display, gdk_root_window, False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+ }
return GDK_FILTER_REMOVE;
}
Atom gdk_wm_delete_window;
Atom gdk_wm_take_focus;
Atom gdk_wm_protocols;
-Atom gdk_wm_window_protocols[2];
+Atom gdk_wm_window_protocols[3];
Atom gdk_selection_property;
gchar *gdk_progclass = NULL;
gboolean gdk_null_window_warnings = TRUE;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include <limits.h>
#include <errno.h>
{
XKeyboardState keyboard_state;
XClassHint *class_hint;
+ guint pid;
XSetErrorHandler (gdk_x_error);
XSetIOErrorHandler (gdk_x_io_error);
NULL, NULL, argv, argc,
NULL, NULL, class_hint);
XFree (class_hint);
+
+ pid = getpid();
+ XChangeProperty (gdk_display, gdk_leader_window,
+ gdk_atom_intern ("_NET_WM_PID", FALSE),
+ XA_CARDINAL, 32,
+ PropModeReplace,
+ (guchar *)&pid, 1);
- gdk_wm_delete_window = XInternAtom (gdk_display, "WM_DELETE_WINDOW", False);
- gdk_wm_take_focus = XInternAtom (gdk_display, "WM_TAKE_FOCUS", False);
- gdk_wm_protocols = XInternAtom (gdk_display, "WM_PROTOCOLS", False);
+ gdk_wm_delete_window = gdk_atom_intern ("WM_DELETE_WINDOW", FALSE);
+ gdk_wm_take_focus = gdk_atom_intern ("WM_TAKE_FOCUS", FALSE);
+ gdk_wm_protocols = gdk_atom_intern ("WM_PROTOCOLS", FALSE);
gdk_wm_window_protocols[0] = gdk_wm_delete_window;
gdk_wm_window_protocols[1] = gdk_wm_take_focus;
- gdk_selection_property = XInternAtom (gdk_display, "GDK_SELECTION", False);
+ gdk_wm_window_protocols[2] = gdk_atom_intern ("_NET_WM_PING", FALSE);
+ gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE);
XGetKeyboardControl (gdk_display, &keyboard_state);
autorepeat = keyboard_state.global_auto_repeat;
const int gdk_nevent_masks = sizeof (gdk_event_mask_table) / sizeof (int);
/* Forward declarations */
-static gboolean gdk_window_gravity_works (void);
-static void gdk_window_set_static_win_gravity (GdkWindow *window,
+static gboolean gdk_window_gravity_works (void);
+static void gdk_window_set_static_win_gravity (GdkWindow *window,
gboolean on);
-static gboolean gdk_window_have_shape_ext (void);
+static gboolean gdk_window_have_shape_ext (void);
+static gboolean gdk_window_icon_name_set (GdkWindow *window);
static GdkColormap* gdk_window_impl_x11_get_colormap (GdkDrawable *drawable);
static void gdk_window_impl_x11_set_colormap (GdkDrawable *drawable,
case GDK_WINDOW_TEMP:
XSetWMProtocols (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
- gdk_wm_window_protocols, 2);
+ gdk_wm_window_protocols, 3);
break;
case GDK_WINDOW_CHILD:
if ((attributes->wclass == GDK_INPUT_OUTPUT) &&
title = attributes->title;
else
title = g_get_prgname ();
-
- XmbSetWMProperties (GDK_WINDOW_XDISPLAY (window),
- GDK_WINDOW_XID (window),
- title, title,
- NULL, 0,
- NULL, NULL, NULL);
+
+ gdk_window_set_title (window, title);
if (attributes_mask & GDK_WA_WMCLASS)
{
}
}
+ if (geom_mask & GDK_HINT_WIN_GRAVITY)
+ {
+ size_hints.flags |= PWinGravity;
+ size_hints.width_inc = geometry->win_gravity;
+ }
+
/* FIXME: Would it be better to delete this property of
* geom_mask == 0? It would save space on the server
*/
&size_hints);
}
+static gboolean
+utf8_is_latin1 (const gchar *str)
+{
+ const char *p = str;
+
+ while (*p)
+ {
+ gunichar ch = g_utf8_get_char (p);
+
+ if (ch >= 0xff)
+ return FALSE;
+
+ p = g_utf8_next_char (p);
+ }
+
+ return TRUE;
+}
+
+/* Set the property to @utf8_str as STRING if the @utf8_str is fully
+ * convertable to STRING, otherwise, set it as compound text
+ */
+static void
+set_text_property (GdkWindow *window,
+ GdkAtom property,
+ const gchar *utf8_str)
+{
+ guchar *prop_text = NULL;
+ GdkAtom prop_type;
+ gint prop_length;
+ gint prop_format;
+
+ if (utf8_is_latin1 (utf8_str))
+ {
+ prop_type = GDK_TARGET_STRING;
+ prop_text = gdk_utf8_to_string_target (utf8_str);
+ prop_length = strlen (prop_text);
+ prop_format = 8;
+ }
+ else
+ {
+ gdk_utf8_to_compound_text (utf8_str, &prop_type, &prop_format,
+ &prop_text, &prop_length);
+ }
+
+ if (prop_text)
+ {
+ XChangeProperty (GDK_WINDOW_XDISPLAY (window),
+ GDK_WINDOW_XID (window),
+ property,
+ prop_type, prop_format,
+ PropModeReplace, prop_text,
+ prop_length);
+
+ g_free (prop_text);
+ }
+}
+
void
gdk_window_set_title (GdkWindow *window,
const gchar *title)
{
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
- if (!GDK_WINDOW_DESTROYED (window))
- XmbSetWMProperties (GDK_WINDOW_XDISPLAY (window),
- GDK_WINDOW_XID (window),
- title, title, NULL, 0, NULL, NULL, NULL);
+ XChangeProperty (GDK_WINDOW_XDISPLAY (window),
+ GDK_WINDOW_XID (window),
+ gdk_atom_intern ("_NET_WM_NAME", FALSE),
+ gdk_atom_intern ("UTF8_STRING", FALSE), 8,
+ PropModeReplace, title,
+ strlen (title));
+
+ set_text_property (window, gdk_atom_intern ("WM_NAME", FALSE), title);
+ if (!gdk_window_icon_name_set (window))
+ set_text_property (window, gdk_atom_intern ("WM_ICON_NAME", FALSE), title);
}
void
XFree (wm_hints);
}
+static gboolean
+gdk_window_icon_name_set (GdkWindow *window)
+{
+ return GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (window),
+ g_quark_from_static_string ("gdk-icon-name-set")));
+}
+
void
gdk_window_set_icon_name (GdkWindow *window,
const gchar *name)
{
- XTextProperty property;
- gint res;
-
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
+
+ g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
+ GUINT_TO_POINTER (TRUE));
+
+ set_text_property (window, gdk_atom_intern ("WM_ICON_NAME", FALSE), name);
+}
+
+void
+gdk_window_iconify (GdkWindow *window)
+{
+ Display *display;
- res = XmbTextListToTextProperty (GDK_WINDOW_XDISPLAY (window),
- &name, 1, XStdICCTextStyle,
- &property);
- if (res < 0)
- {
- g_warning ("Error converting icon name to text property: %d\n", res);
- return;
- }
-
- XSetWMIconName (GDK_WINDOW_XDISPLAY (window),
- GDK_WINDOW_XID (window),
- &property);
-
- if (property.value)
- XFree (property.value);
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (GDK_IS_WINDOW (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+ display = GDK_WINDOW_XDISPLAY (window);
+ XIconifyWindow (display, GDK_WINDOW_XWINDOW (window), DefaultScreen (display));
}
void